import random

class MySort:
    def __init__(self, arr_len):
        self.arr = [3, 87, 2, 93, 78, 56, 61, 38, 12, 40]  # 列表
        # self.arr = []
        self.arr_len = arr_len  # 列表长度
        # self.temp_arr = [0] * self.arr_len

    def random_int(self):
        for i in range(self.arr_len):
            self.arr.append(random.randint(0, 99))

    def test_sort(self, sort_method, *args, **kwargs):
        print(self.arr)
        sort_method(*args, **kwargs)
        print(self.arr)

    def ajust_max_heap(self, dad, arr_len):
        """
        将某颗子树调整为大根堆
        :param dad:
        :param arr_len:
        :return:
        """
        arr = self.arr
        son = 2 * dad + 1  # 找到左孩子位置
        while son < arr_len:
            # 拿左孩子和右孩子进行比较
            if son + 1 < arr_len and arr[son] < arr[son + 1]:
                son += 1
            if arr[son] > arr[dad]:  # 一旦发生交换，孩子变为父亲继续调整
                arr[son], arr[dad] = arr[dad], arr[son]
                dad = son
                son = 2 * dad + 1
            else:
                break

    def heap(self):
        arr = self.arr
        for i in range(self.arr_len // 2 - 1, -1, -1):
            self.ajust_max_heap(i, self.arr_len)
        # 交换根部元素和数组最后一个元素
        arr[0], arr[self.arr_len - 1] = arr[self.arr_len - 1], arr[0]
        for i in range(self.arr_len - 1, 1, -1):
            self.ajust_max_heap(0, i)
            arr[0], arr[i - 1] = arr[i - 1], arr[0]



if __name__ == '__main__':
    temp = MySort(10)
    # temp.random_int()
    # print(temp.arr)
    temp.test_sort(temp.heap)  # 方法也可以传递